package main

import (
	"fmt"
	"runtime"
	"sync"
	"time"
)

//互斥锁忘记解锁
func main() {
	total := 0
	defer func() {
		time.Sleep(time.Second)
		fmt.Println("total: ", total)
		fmt.Println("goroutines: ", runtime.NumGoroutine())
	}()

	var mutex sync.Mutex
	for i := 0; i < 10; i++ {
		go func() {
			mutex.Lock()
			//defer mutex.Unlock()   建议写法
			total += 1
		}()
	}
}

/*
在这个例子中，第一个互斥锁 sync.Mutex 加锁了，但是他可能在处理业务逻辑，又或是忘记 Unlock 了。
因此导致后面的所有 sync.Mutex 想加锁，却因未释放又都阻塞住了。
*/
